!-------------------------------------------------------------LICENSE--------------------------------------------------------------!
!                                                                                                                                  !
!The MAP code is written in Fortran language for magnetohydrodynamics (MHD) calculation with the adaptive mesh refinement (AMR)    !
!and Message Passing Interface (MPI) parallelization.                                                                              !
!                                                                                                                                  !
!Copyright (C) 2012                                                                                                                !
!Ronglin Jiang                                                                                                                     !
!rljiang@ssc.net.cn                                                                                                                !
!585 Guoshoujing Road. Pudong, Shanghai, P.R.C. 201203                                                                             !
!                                                                                                                                  !
!This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License         !
!as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.             !
!                                                                                                                                  !
!This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of    !
!MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.                        !
!                                                                                                                                  !
!You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software     !
!Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.                                                   !
!                                                                                                                                  !
!-------------------------------------------------------------LICENSE--------------------------------------------------------------!

!==================================================================================================================================|
subroutine bnd_free (var, nx, ny, nz, ng, dir, sides)
!==================================================================================================================================|
!  sides = 'l' for lower boundary
!  sides = 'h' for higher boundary
!  sides = 'b' for both
!----------------------------------------------------------------------------------------------------------------------------------|

   implicit none

   character(1), intent(in) ::  dir, sides
   integer(4), intent(in) :: nx, ny, nz, ng
   real(8), dimension(nx, ny, nz), intent(inout) :: var

   integer(4) :: i, j, k, bnd0, bnd1
   
!----------------------------------------------------------------------------------------------------------------------------------|
   if (dir .eq. 'x') then

      bnd0 = 1 + ng
      bnd1 = nx - ng

      if (sides .eq. 'l') then
         do k = 1, nz
         do j = 1, ny
         do i = 1, ng
            var(bnd0 - i, j, k) = var(bnd0, j, k)
         enddo
         enddo
         enddo
      endif
      if (sides .eq. 'h') then
         do k = 1, nz
         do j = 1, ny
         do i = 1, ng
            var(bnd1 + i, j, k) = var(bnd1, j, k)
         enddo
         enddo
         enddo
      endif
      if (sides .eq. 'b') then
         do k = 1, nz
         do j = 1, ny
         do i = 1, ng
            var(bnd0 - i, j, k) = var(bnd0, j, k)
            var(bnd1 + i, j, k) = var(bnd1, j, k)
         enddo
         enddo
         enddo
      endif

   elseif (dir .eq. 'y') then

      bnd0 = 1 + ng
      bnd1 = ny - ng

      if (sides .eq. 'l') then
         do k = 1, nz
         do j = 1, ng
         do i = 1, nx
            var(i, bnd0 - j, k) = var(i, bnd0, k)
         enddo
         enddo
         enddo
      endif
      if (sides .eq. 'h') then
         do k = 1, nz
         do j = 1, ng
         do i = 1, nx
            var(i, bnd1 + j, k) = var(i, bnd1, k)
         enddo
         enddo
         enddo
      endif
      if (sides .eq. 'b') then
         do k = 1, nz
         do j = 1, ng
         do i = 1, nx
            var(i, bnd0 - j, k) = var(i, bnd0, k)
            var(i, bnd1 + j, k) = var(i, bnd1, k)
         enddo
         enddo
         enddo
      endif

   elseif (dir .eq. 'z') then

      bnd0 = 1 + ng
      bnd1 = nz - ng

      if (sides .eq. 'l') then
         do k = 1, ng
         do j = 1, ny
         do i = 1, nx
            var(i, j, bnd0 - k) = var(i, j, bnd0)
         enddo
         enddo
         enddo
      endif
      if (sides .eq. 'h') then
         do k = 1, ng
         do j = 1, ny
         do i = 1, nx
            var(i, j, bnd1 + k) = var(i, j, bnd1)
         enddo
         enddo
         enddo
      endif
      if (sides .eq. 'b') then
         do k = 1, ng
         do j = 1, ny
         do i = 1, nx
            var(i, j, bnd0 - k) = var(i, j, bnd0)
            var(i, j, bnd1 + k) = var(i, j, bnd1)
         enddo
         enddo
         enddo
      endif

   else

      write (*, *) 'Direction error from bnd_free.'
      stop

   endif

!----------------------------------------------------------------------------------------------------------------------------------|
   return
end subroutine bnd_free
